import Notification from '../notification'

const prefixCls = 'sh-message'
const iconPrefixCls = 'sh-icon'
const prefixKey = 'sh_message_key_'

const defaults = {
  top: 24,
  duration: 1.5
}

let messageInstance
let name = 1

const iconTypes = {
  'info': 'icon-info',
  'success': 'icon-success',
  'warning': 'icon-warning',
  'error': 'icon-error',
  'loading': 'icon-right-turn'
}

function getMessageInstance () {
  messageInstance = messageInstance || Notification.newInstance({
    prefixCls: prefixCls,
    styles: {
      top: `${defaults.top}px`
    }
  })

  return messageInstance
}

function notice (content = '', duration = defaults.duration, type, onClose = function () {}, closable = false, render = function () {}) {
  const iconType = iconTypes[type]

  // if loading
  const loadCls = type === 'loading' ? ' sh-load-loop' : ''

  let instance = getMessageInstance()

  instance.notice({
    name: `${prefixKey}${name}`,
    duration: duration,
    styles: {},
    transitionName: 'move-up',
    content: `
            <div class="${prefixCls}-custom-content ${prefixCls}-${type}">
                <i class="${iconPrefixCls} ${iconType} ${loadCls} iconfont"></i>
                <span>${content}</span>
            </div>
        `,
    render: render,
    onClose: onClose,
    closable: closable,
    type: 'message'
  })

  // 用于手动消除
  return (function () {
    let target = name++

    return function () {
      instance.remove(`${prefixKey}${target}`)
    }
  })()
}

// export default {
//   name: 'Message',

//   info (options) {
//     return this.message('info', options)
//   },
//   success (options) {
//     return this.message('success', options)
//   },
//   warning (options) {
//     return this.message('warning', options)
//   },
//   error (options) {
//     return this.message('error', options)
//   },
//   loading (options) {
//     return this.message('loading', options)
//   },
//   message (type, options) {
//     if (typeof options === 'string') {
//       options = {
//         content: options
//       }
//     }
//     return notice(options.content, options.duration, type, options.onClose, options.closable, options.render)
//   },
//   config (options) {
//     if (options.top || options.top === 0) {
//       defaults.top = options.top
//     }
//     if (options.duration || options.duration === 0) {
//       defaults.duration = options.duration
//     }
//   },
//   destroy () {
//     let instance = getMessageInstance()
//     messageInstance = null
//     instance.destroy('sh-message')
//   }
// }

const Message = function (options) {
  options = options || {}
  if (typeof options === 'string') {
    options = {
      message: options
    }
  }
  const message = function (type, options) {
    if (typeof options === 'string') {
      options = {
        message: options
      }
    }
    return notice(options.message, options.duration, type, options.onClose, options.closable, options.render)
  }
  return message(options.type, options)
}

Message.install = function (Vue) {
  Vue.prototype.$message = Message
}

export default Message
